
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
#include <string.h>

int main (void){
  /*
    Principe d'utilisation :
    clef            -->   donnée
    nomDeVariable   -->   type

    Remarque :
       Je ne suis pas sûr de l'utilisation au niveau des lignes telles que : 
       {
         e.key = "value";
       }
       en effet, nous n'allouons pas la chaine de caractère "value", ce qui
       impliquerait le stockage d'une variable locale..
       Néanmoins cela semble marcher pour l'instant...
       Nous continuons cette utilisation en gardant à l'esprit une solution 
       proposée :
       {
          e.key = strdup("value");
	  //utilisation de e.key
	  free(e.key);
       }
  */


  /* on créer un objet de structure hsearch_data qui pointe 
     sur chaque table de hachage */
  struct hsearch_data htable[2];
  htable[0] = (struct hsearch_data) {0};
  htable[1] = (struct hsearch_data) {0};


  /* on créer les tables de hachage */
  hcreate_r(1000,&htable[0]);
  hcreate_r(1000,&htable[1]);


  /* entrée d'un élément dans les tables */
  ENTRY *retval; // non utilisé ici
  //dans la premiere table: htable1
  ENTRY e1;
  //createEntry(e1, "nomVariable", [][types]);
  e1.key = "clef";  //la clef -> nom de variable (char *)
  e1.data = "data";  //la donnée -> type (char *v[])
  
  int retour = hsearch_r(e1, ENTER, &retval, &htable[0]); //retval n'est pas utilisé ici
  if (retour == 0) { //si la table est pleine
    fprintf(stderr, "Erreur - l'entrée a échoué.\n");
    exit(EXIT_FAILURE);
  } 

  //dans la deuxieme table: htable2
  ENTRY e2;
  e2.key = "int";  //la clef
  e2.data = "une donnée associé à int";  //la donnée
  printf("longueur de la chaine : %d\n", strlen(e2.data));
  retour = hsearch_r(e2, ENTER, &retval, &htable[1]); //retval n'est pas utilisé ici
  if (!retour) { //si la table est pleine
    fprintf(stderr, "Erreur - l'entrée a échoué.\n");
    exit(EXIT_FAILURE);
  }


  /* la recherche d'un élément dans les tables */
  //On definit le pointeur ici
  ENTRY e;

  //La recherche
  e.key = "int"; //le mot clé qui est cherché
  //cherche dans la premiere table htable1
  retour = hsearch_r(e, FIND, &retval, &htable[0]);
  if (retour)
    printf("Trouvé! Clé:%s Donnée:%s\n",retval->key,(char*)retval->data);
  else 
    printf("Clé pas trouvé\n");
  //cherche dans la deuxieme table htable2
  retour = hsearch_r(e, FIND, &retval, &htable[1]);
  if (retour) 
    printf("Trouvé! Clé:%s Donnée:%s\n",retval->key,(char*)retval->data);
  else 
    printf("Clef pas trouvé\n"); 

  hdestroy_r(&htable[0]);
  hdestroy_r(&htable[1]);

  return EXIT_SUCCESS;
}
